分享好友 技术首页 技术分类 切换频道

LCD1620和LCD12864I/O控制显示

2020-07-19 15:25270

 

//LCD1620——I/O模拟控制方式
#Include <reg52.h>
#Include <intrins.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;

sbit rs = P2^0; //寄存器选择信号,高表示数据、低表示指令
sbit rw = P2^1; //读写控制信号,高表示读、低表示写
sbit ep = P2^2;//片选使能信号。下降沿触发

BYTE code dis1[] = {"abcdef"};//每行zui多显示16个字符
BYTE code dis2[] = {"ABCDEF"};

delay(BYTE ms)// 延时子程序
{      
 BYTE i;
 while(ms--)
 {
  for(i = 0; i< 250; i++)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
 }
}

BOOL lcd_bz()// 测试LCD忙碌状态 011
{       
 BOOL result;
 rs = 0;//指令
 rw = 1;//读
 ep = 1;//使能
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 result = (BOOL)(P0 & 0x80);//读忙标志和地址计数器ACC的值
 //P0口如果等于0X80,则说明不忙碌,(数据总线的高位为1)
 ep = 0;//使能下降沿触发
 return result; 
}

lcd_wcmd(BYTE cmd)// 写入指令数据到LCD 000
{      
 while(lcd_bz());
 rs = 0;
 rw = 0;
 ep = 0;//下降沿
 _nop_();
 _nop_(); 
 P0 = cmd;//写指令数据,已经定义“ BYTE cmd”
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 1; //高
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 0; //低 
}

lcd_pos(BYTE pos)//设定显示位置
{       
 lcd_wcmd(pos | 0x80);
}

lcd_wdat(BYTE dat)//写入字符显示数据到LCD 100 
{      
 while(lcd_bz());
 rs = 1;
 rw = 0;
 ep = 0;
 P0 = dat;//写数据数据,已经定义“BYTE dat”
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 1; //高
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 0; //低
}

lcd_init() //LCD初始化设定
{       
 lcd_wcmd(0x38);   //打开显示开关、允许移动位置、允许功能设置
 delay(1);
 lcd_wcmd(0x0c);   //打开显示开关、设置输入方式
 delay(1);
 lcd_wcmd(0x06);   //设置输入方式、光标返回
 delay(1);
 lcd_wcmd(0x01);   //清除LCD的显示内容
 delay(1);
}

main()
{
 BYTE i;
 lcd_init();    // 初始化LCD   
 delay(10);
 lcd_pos(0);    // 设置显示位置为*行的第5个字符
 i = 0;
 while(dis1[i] != '0')
 {      // 显示字符"abcdef"
  lcd_wdat(dis1[i]);
  i++;
 }
 //lcd_pos(0x41);   // 设置显示位置为第二行第二个字符
 lcd_pos(64);   // 设置显示位置为第二行第1个字符
 i = 0;
 while(dis2[i] != '0')
 {
  lcd_wdat(dis2[i]); // 显示字符"ABCDEF "
  i++;
 }
 while(1);    //
}

//LCD12864—I/O模拟控制显示方式
/********************************************/
/* 12864系列测试程序  */
//128*64--16行*8页*64列
/********************************************/

#Include <reg51.h>
#Include <ctype.h>
#Include <string.h>
#Include <stdlib.h>
#Include <stdio.h>
#Include <math.h>

#define Disp_On  0x3f//显示开0011 111X 显示开/关指令
#define Disp_Off 0x3e//显示关0011 111X  显示开/关指令
#define Col_Add  0x40//设置列地址01XX XXXX(0-63列)
#define Page_Add 0xb8 //设置页地址指令1011 1XXX(0-7页)、页(PAGE)设置指令
#define Start_Line 0xc0//起始行11XX XXXX(0-63行)显示起始行(ROW)设置指令

#define Lcd_Bus P0  //总线接口 MCU P1<------> LCM
sbit Mcs=P2^6;  //主芯片选中(使能 Master chip enable)
sbit Scs=P2^5;  //从芯片选中(使能 Slave chip enable)
sbit Enable=P2^7; //LCD信号使能 6800 mode Enable single  
sbit Di=P2^4;  //数据、命令选择端 Data or Instrument Select
sbit RW=P2^3;  //读写控制端 Write or Read
sbit Lcd_Rst=P1^0; //Lcm reset
/*
#Include<absacc.h>
#define LCD_CMD_WRA      XBYTE[0x8008] //;写指令代码,RS=0、R/W=0
#define LCD_DATA_WRA  XBYTE[0x8009] //;写数据,RS=1、R/W=0
#define LCD_BUSY_RDA  XBYTE[0x800A] //;读忙标志和AC值,RS=0、R/W=1
#define LCD_DATA_RDA  XBYTE[0x800B] //;读数据,RS=1、R/W=1
#define LCD_CMD_WRB      XBYTE[0x8004] //;写指令代码,RS=0、R/W=0
#define LCD_DATA_WRB  XBYTE[0x8005] //;写数据,RS=1、R/W=0
#define LCD_BUSY_RDB  XBYTE[0x8006] //;读忙标志和AC值,RS=0、R/W=1
#define LCD_DATA_RDB  XBYTE[0x8007] //;读数据,RS=1、R/W=1
*/
char code ce[]={
/*-- 文字: 测 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00
};
char code shi[]={
/*-- 文字: 试 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00,
0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00
};
char code kai[]={
/*-- 文字: 开 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00
};
char code shi3[]={
/*-- 文字: 始 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x90,0x70,0x1F,0x12,0xF0,0x00,0x20,0x70,0x28,0x27,0x22,0x28,0x70,0x20,0x00,
0x40,0x21,0x12,0x0C,0x06,0x09,0x30,0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00
};
char code wan[]={
/*-- 文字: 完 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x90,0x8C,0xA4,0xA4,0xA4,0xA5,0xA6,0xA4,0xA4,0xA4,0xA4,0x94,0x8C,0x04,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x70,0x00,0x00
};
char code bi[]={
/*-- 文字: 毕 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFF,0x88,0x48,0x28,0x08,0x80,0x7F,0x88,0x88,0x88,0x84,0x84,0xE0,0x00,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00
};
//-----------------延时子程序-----------------------------
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
//----------------写命令到LCD------------------------------
void write_com(unsigned char cmdcode)//RS=0、RW=0、E=“1—》0”
{
Di=0;
RW=0;
Lcd_Bus=cmdcode;
delay(0);
Enable=1;
delay(0);
Enable=0;
}
//------------------写数据到LCD----------------------------
void write_data(unsigned char Dispdata)//RS=1、RW=0、E=“1—》0”
{
Di=1;
RW=0;
Lcd_Bus=Dispdata;
delay(0);
Enable=1;
delay(0);
Enable=0;
}
//------------------读LCD数据----------------------------
unsigned char read_data()//RS=1、RW=1、E=1
{
unsigned char tmpin;
Di=1;
RW=1;
delay(0);
Enable=1;
delay(0);
Enable=0;
tmpin=Lcd_Bus;
return tmpin;
}
//-----------------清除内存---------------
void Clr_Scr()
{
unsigned char j,k;
Mcs=1;Scs=1;

 write_com(Page_Add+0);
 write_com(Col_Add+0);

 for(k=0;k<8;k++)//8页
 {
  write_com(Page_Add+k);//0-8
  for(j=0;j<64;j++)//64列
      write_data(0x00);
 }
}
//--------------------指定位置显示汉字16*16-----------------------
void hz_disp16(unsigned char pag,unsigned char col, unsigned char code *hzk)
{
unsigned char j=0,i=0;
for(j=0;j<2;j++)
{
write_com(Page_Add+pag+j);
write_com(Col_Add+col);
for(i=0;i<16;i++) write_data(hzk[16*j+i]);
}
}
//-----------------初始化LCD屏--------------------------
void init_lcd()
{
Lcd_Rst=0;delay(100);
Lcd_Rst=1;delay(100);
Mcs=1;Scs=1;delay(100);
write_com(Disp_Off);
write_com(Page_Add+0);
write_com(Start_Line+0);
write_com(Col_Add+0);
write_com(Disp_On);
}
//---------------------------信息显示---------------------
void Msg(int flg)
{
Clr_Scr();
if(flg==0)//显示“测试开始”
{
Mcs=1;Scs=0;
hz_disp16(3,32,ce);delay(2000);
hz_disp16(3,48,shi);delay(2000);
Mcs=0;Scs=1;
hz_disp16(3,0,kai);delay(2000);
hz_disp16(3,16,shi3);delay(2000);
}
else if(flg==1)//显示“测试完毕”
{
Mcs=1;Scs=0;
hz_disp16(3,32,ce);
hz_disp16(3,48,shi);
Mcs=0;Scs=1;
hz_disp16(3,0,wan);
hz_disp16(3,16,bi);
}
}
//-------------------主程序--------------------------------
main()
{
unsigned char i=0;
init_lcd();
while(1)
 {
Msg(0);delay(10000);
Msg(1);delay(10000);
 }
}

免责声明:矿库网文章内容来源于网络,为了传递信息,我们转载部分内容,尊重原作者的版权。所有转载文章仅用于学习和交流之目的,并非商业用途。如有侵权,请及时联系我们删除。感谢您的理解与支持。

点赞 0
举报
收藏 0
评论 0
分享 0
西门子200PLC使用Modbus协议的要求
Modbus主站协议指令使用来自S7--200PLC的下列资源: 初始化Modbus从站协议使特定的CPU端口专用于Modbus主站协议通讯。当CPU端口用于Modbus主站协议通讯时,它无法用于其它用途,包括与STEP7--Micro/WIN通讯。MBUS_CTRL指令控制Port0的设

0评论2020-07-2087

控制器的工作原理
 控制器有两种由于设计方法,因而结构也不同。微操作是指不可再分解的操作,进行微操作总是需要相应的控制信号(称为微操作控制信号或微操作命令)。一台数字计算机基本上可以划分为两大部分---控制部件和执行部件。控制器就是控制部件

0评论2020-07-2090

什么是ROHS认证?ROHS要测哪些项?

0评论2020-07-1915

关于应对欧盟RoHS指令 提升无铅制程技术应用水平

0评论2020-07-1913

欧姆龙与三菱PLC之间的通信的实现

0评论2020-07-1927

三菱FX1S系列PLC主要功能介绍

0评论2020-07-1911

关于FX-20P手持式编程器的操作说明

0评论2020-07-1910

西门子PLC与ABPLCZ主要的差别

0评论2020-07-1915

初学PLC的几个误区

0评论2020-07-1911